package com.macro.mall.demo.design.pattern.singleton;

/**
 * 单例模式
 * 1.Java开发大部分使用的都是单例模式，Spring bean注解默认是单例模式 - 适合缓存、日志、配置、大部分业务实现类等
 * 2.单例模式在多线程环境下，可能会导致线程安全问题，需要使用synchronized关键字、Lock锁、ThreadLocal等
 * 3.多例模式（如原型模式），每个实例都有自己的内存空间，不会出现线程安全问题，会增加内存开销（频繁创建销毁实例对象）- 适合任务调度系统中的任务对象
 *
 * 例子：double check 懒汉单例
 */
public class SingletonPattern {
    // 使用volatile关键字确保多线程环境下的可见性
    private static volatile SingletonPattern instance;

    // 私有构造函数，防止外部实例化
    private SingletonPattern() {
        // 可以在这里添加初始化代码
    }

    // 提供全局访问点
    public static SingletonPattern getInstance() {
        // 第一次检查，如果instance不为null，直接返回
        if (instance == null) {
            // 同步代码块，确保线程安全
            synchronized (SingletonPattern.class) {
                // 第二次检查，确保在多线程环境下只有一个实例被创建
                if (instance == null) {
                    instance = new SingletonPattern();
                }
            }
        }
        return instance;
    }
}
